# application/mapper/system/dict.py
import datetime
from application.extensions.databases import db
from application.models.detection.product_model import ProductModel
from typing import List, Dict, Any


class ProductModelMapper:
    """字典数据访问层"""

    @staticmethod
    def get_product_model_list(
        page_num: int, page_size: int, conditions: Dict[str, Any] = None
    ) -> tuple:
        """
        分页获取产品型号数据列表
        :param page_num: 页码
        :param page_size: 每页数量
        :param conditions: 查询条件
        :return: (产品型号数据列表, 总数)
        """
        query = db.session.query(ProductModel)

        # 添加查询条件
        if conditions:
            if conditions.get("productModel"):
                query = query.filter(
                    ProductModel.product_model.like(f"%{conditions['productModel']}%")
                )
            if conditions.get("productType"):
                query = query.filter(
                    ProductModel.product_type.like(f"%{conditions['productType']}%")
                )
            if conditions.get("productPhase"):
                query = query.filter(
                    ProductModel.product_phase.like(f"%{conditions['productPhase']}%")
                )

        # 获取总数
        total = query.count()

        # 分页查询
        offset = (page_num - 1) * page_size
        product_model_list = (
            query.order_by(ProductModel.product_model_id)
            .offset(offset)
            .limit(page_size)
            .all()
        )

        return product_model_list, total

    @staticmethod
    def create_product_model(product_model: ProductModel) -> ProductModel:
        """
        创建产品型号
        :param product_model: 产品型号对象
        :return: 创建后的产品型号对象
        """
        db.session.add(product_model)
        db.session.commit()
        return product_model

    @staticmethod
    def update_product_model(product_model: ProductModel) -> ProductModel:
        """
        更新产品型号
        :param product_model: 产品型号对象
        :return: 更新后的产品型号对象
        """
        db.session.commit()
        return product_model

    @staticmethod
    def get_all_product_models() -> List[ProductModel]:
        """
        获取所有产品型号
        :return: 产品型号列表
        """
        return db.session.query(ProductModel).filter(ProductModel.del_flag == '0').all()

    @staticmethod
    def get_product_model_by_id(product_model_id: int) -> ProductModel:
        """
        根据ID获取产品型号
        :param product_model_id: 产品型号ID
        :return: 产品型号对象
        """
        return (
            db.session.query(ProductModel)
            .filter(ProductModel.product_model_id == product_model_id)
            .first()
        )

    @staticmethod
    def delete_product_model(product_model: ProductModel) -> None:
        """
        删除产品型号
        :param product_model: 产品型号对象
        :return: None
        """
         # 设置删除标志为1，表示已删除
        product_model.del_flag = 1
        # 更新删除时间
        db.session.commit()